#ifndef DIVSELBASE_H
#define DIVSELBASE_H

#include "BaseMultSel.h"

//#include "lib.h"
#include "TypeClasse.h"

class Joueur;

/**
 * Classe permettant la sélection des catégories de compétences
 * non-martiales. Fait appel à SelectionComp pour la sélection de
 * compétences proprement dites.
 *
 * @see BaseMultSel
 * @see SelectionComp
 * @author Johan "Solo" Luisier
 */
class DivSelBase : public BaseMultSel
{
  Q_OBJECT
 public:
  DivSelBase(const unsigned& nbr, const std::string* ptr, Joueur* j,
	     QWidget* parent = 0);
  DivSelBase(const DivSelBase& divSel);
  virtual ~DivSelBase();
  StatusCode compDivSelection(std::vector<unsigned>& vec);
 protected:
  /**
   * Pointeur sur le PJ pour lequel on veut sélectionner des
   * compétences non-martiales.
   */
  Joueur* joueur;
  /**
   * Contient les numéros des compétences sélectionnées.
   */
  std::vector<unsigned> compChoisies;
  /**
   * Pointeur sur le conteneur J_CompDiv du PJ pointé par joueur.
   */
  const std::vector<unsigned> *compDejaPrises;
  /**
   * Pointeur sur le conteneur des types de compétences accessibles au
   * PJ joueur sans payer un supplément de coût.
   */
  const std::vector<TypeClasse> *accesJoueur;
  unsigned nbrCompDejaPrises, /**< Nombre de compétences déjà
				     connues par le PJ. */
    nbrAccess;/**< Nombre de types de compétences accessibles par le PJ. */
  /**
   * Contient \e true à l'emplacement i si la i-ème compétence est déjà
   * connue par le PJ.
   */
  std::vector<bool> aDeja;
  std::vector<unsigned>::const_iterator
    Begin, /**< Itérateur pointant sur le premier élément des
	      compétences déjà connues */
    End, /**< Itérateur pointant sur la fin du conteneur des
	      compétences déjà connues */
    It; /**< Itérateur, membre pour des raisons d'optimisation
	   d'allocation de mémoire. */
 private:
  void prepareBoutons();
 private slots:
  void selectionner();
};

#endif // DIVSELBASE_H
